package sample4.provider.ddl;

import android.text.TextUtils;

/**
 * Create table...
 */
public class SqliteTableBuilder extends AbsDdlBuilder {
    /** PRIMARY KEY AUTOINCREMENT NOT NULL */
    public static final String CONSTRAINT_PRIMARY_KEY_AUTOINCREMENT_NOT_NULL = " PRIMARY KEY AUTOINCREMENT NOT NULL ";
    /** PRIMARY KEY AUTOINCREMENT NOT NULL */
    public static final String CONSTRAINT_PRIMARY_KEY = " PRIMARY KEY AUTOINCREMENT NOT NULL ";
    /** AUTOINCREMENT */
    public static final String CONSTRAINT_AUTOINCREMENT = " AUTOINCREMENT ";
    /** NOT NULL */
    public static final String CONSTRAINT_NOT_NULL = " NOT NULL ";

    /**
     * @param name
     */
    public SqliteTableBuilder(String name) {
        super(name);
    }

    /**
     * Integerタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addIntegerColumn(String columnName) {
        return addIntegerColumn(columnName, null);
    }

    /**
     * Integerタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @param columnConstraint Constraint
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addIntegerColumn(String columnName, String columnConstraint) {
        add(columnName + " INTEGER", columnConstraint);
        return this;
    }

    /**
     * 文字列タイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addTextColumn(String columnName) {
        return addTextColumn(columnName, null);
    }

    /**
     * 文字列タイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @param columnConstraint Constraint
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addTextColumn(String columnName, String columnConstraint) {
        add(columnName + " TEXT", columnConstraint);
        return this;
    }

    /**
     * Numericタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addNumericColumn(String columnName) {
        return addNumericColumn(columnName, null);
    }

    /**
     * Numericタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @param columnConstraint Constraint
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addNumericColumn(String columnName, String columnConstraint) {
        add(columnName + " NUMERIC", columnConstraint);
        return this;
    }

    /**
     * Blobタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addBlobColumn(String columnName) {
        return addBlobColumn(columnName, null);
    }

    /**
     * Blobタイプのカラムを追加する
     * 
     * @param columnName カラム名
     * @param columnConstraint Constraint
     * @return　SqliteTableBuilder
     */
    public SqliteTableBuilder addBlobColumn(String columnName, String columnConstraint) {
        add(columnName + " BLOB", columnConstraint);
        return this;
    }

    @Override
    String toDropSql() {
        return "DROP TABLE IF EXISTS " + getName();
    }

    @Override
    String toCreateSql() {
        StringBuilder sql = new StringBuilder();
        // start
        sql.append("CREATE TABLE IF NOT EXISTS ").append(getName()).append('(');
        // contents
        boolean addComma = false;
        for (String part : getColumn()) {
            if (addComma) {
                sql.append(',');
            }
            addComma = true;
            sql.append('\n').append(part);
        }
        // end
        sql.append('\n').append(");");
        return sql.toString();
    }

    private void add(String columnPart, String constraintPart) {
        if (TextUtils.isEmpty(constraintPart)) {
            addColumn(columnPart);
        } else {
            addColumn(columnPart + " " + constraintPart);
        }
    }
}
